// 1. 导入包 介绍
import globals from "globals"
// 推荐的检验js规范
import pluginJs from "@eslint/js"
// 推荐的ts规范，加入它，eslint 识别 ts
import tseslint from "typescript-eslint"
// 推荐的vue的规范，加入它，eslint 识别 vue
import pluginVue from "eslint-plugin-vue"
// 覆盖掉eslint的规范, 一定要放在最后
import prettierRecommended from "eslint-plugin-prettier/recommended"

// 2. 各种配置

// mjs --- esModule 规范的文件
// cjs --- commonjs 规范的文件

/* 
import 默认不能去引用json
import autoImport from "./.eslintrc-auto-import.json" 配置不生效，执行npm run lint,会报错

解决方法一，实验型语法，加with { type: "json" }，但由于是会报警告,会报错
import autoImport from "./.eslintrc-auto-import.json" with { type: "json" }

解决方法二，fs.readFile

解决方法三，使用node导入，现在项目的用法
 */
import { createRequire } from "module"
const require = createRequire(import.meta.url)
// import.meta.url ===> file:///D:/code/my-poject/vue-drill/vue3-admin/eslint.config.js?mtime=1735950518270
const autoImport = require("./.eslintrc-auto-import.json")
export default [
  // 要校验的文件
  { files: ["**/*.{js,mjs,cjs,ts,vue}"] },
  {
    languageOptions: {
      /** 增加全局变量的合法校验
       *对于eslint来说，任何变量都需要定义，不管是否全局变量。
       *这也可避免我们在项目中使用一些真的不存在的变量时导致出现一些低级错误。
       *全局变量window，这样console，才不会报错。
       *全局变量node require，才不会报错
       */
      globals: { ...globals.browser, ...globals.node, ...autoImport.globals }
    }
  },
  // 这里还要注意规则的优先级问题，后面的规则会覆盖前面的规则，
  // 所以一般会把recommended写在最前面，然后后面再去关掉 / 启用一些其他规则。
  // 推荐的检验js规范
  pluginJs.configs.recommended,
  // 推荐的ts规范
  ...tseslint.configs.recommended,
  // 推荐的vue的规范
  ...pluginVue.configs["flat/essential"],
  {
    /* 
    给.vue，增加的额外配置，和自定义配置
    指定匹配的后缀文件或者目录用此规则或者解析器。
    如果不写files，则该规则配置对所有文件起作用。 
    */
    files: ["**/*.vue"],
    // 配置解析器，检验vue中的ts代码
    languageOptions: {
      parserOptions: { parser: tseslint.parser }
    }
  },
  /* 
  {
    // 全局配置，那些文件不通过，eslint校验
    ignores: ['.css', '*.d.ts'],
  },
  */
  {
    // 全局配置，自定义规则,根据需要增加  eslint 主要是校验代码规范  prettier  格式化代码的
    rules: {
      // pluginJs.configs.recommended中并没有no-console规则，除非你用eslint.configs.all。
      // 要自己加上 no-console
      "no-console": "warn",
      // 可以格式化，不常用，eslint主要是校验代码规范，不关心格式化问题
      // 用  来格式化代码
      // semi: ["error"]
      // 不加这行的话，会报错vue组件名，要多个单词组成，......
      // 解决一 文件名 Home.vue 改为 Home-u.vue
      // 解决二 eslint.config.js 文件增加 下面代码
      // 3. 文件名报错
      "vue/multi-word-component-names": "off"
    }
  },
  /*   覆盖掉eslint的规范
  作用是off与它冲突的ESlint规则，并且启用自己的Recommended规则，
  并且它会自动合并prettier.config.js配置，
  所以我们还需要在根目录创建一份prettier.config.js
   */
  prettierRecommended
]
